window: Implement gtk_window_destroy
authorMatthias Clasen <mclasen@redhat.com>
Sat, 9 May 2020 19:20:59 +0000 (15:20 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 11 May 2020 16:20:59 +0000 (12:20 -0400)
Don't call gtk_widget_destroy; instead implement
gtk_window_destroy outselves by removing the window
from the toplevel lista and dropping the reference that
GTK holds.

gtk/gtkwindow.c

index 4daa7254275e489be2ea3dc9a0dd1329bb828a11..4be18552abd57572c14b3ffef8b505a8e1e39f05 100644 (file)
@@ -2367,31 +2367,12 @@ gtk_window_dispose (GObject *object)
 {
   GtkWindow *window = GTK_WINDOW (object);
   GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
-  guint i;
 
   gtk_window_release_application (window);
 
-  for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (toplevel_list)); i++)
-    {
-      gpointer item = g_list_model_get_item (G_LIST_MODEL (toplevel_list), i);
-      if (item == window)
-        {
-          g_list_store_remove (toplevel_list, i);
-          break;
-        }
-      else
-        g_object_unref (item);
-    }
-
   if (priv->transient_parent)
     gtk_window_set_transient_for (window, NULL);
 
-  if (priv->has_user_ref_count)
-    {
-      priv->has_user_ref_count = FALSE;
-      g_object_unref (window);
-    }
-
   if (priv->group)
     gtk_window_group_remove_window (priv->group, window);
 
@@ -7525,7 +7506,23 @@ gtk_window_get_child (GtkWindow *window)
 void
 gtk_window_destroy (GtkWindow *window)
 {
+  int i;
+
   g_return_if_fail (GTK_IS_WINDOW (window));
 
-  gtk_widget_destroy (GTK_WIDGET (window));
+  for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (toplevel_list)); i++)
+    {
+      gpointer item = g_list_model_get_item (G_LIST_MODEL (toplevel_list), i);
+      if (item == window)
+        {
+          g_list_store_remove (toplevel_list, i);
+          break;
+        }
+      else
+        g_object_unref (item);
+    }
+
+  gtk_widget_unrealize (GTK_WIDGET (window));
+
+  g_object_unref (window);
 }